package main

import (
	"fmt"
	"math"
	"reflect"
	"strconv"
)

// 有符号整形
//	int8 -128 -- 127
// 	int16 -32768 -- 32767
// 	int32  int64
// 无符号整数
//	uint8 uint16 uint32 uint64

// 整形的数据转换
func Proj1() {
	var a1 int8 = 10
	var a2 int16 = 128

	// 数据从低向高转换
	a3 := int16(a1) + a2
	fmt.Println(a1, reflect.TypeOf(a1), a2, reflect.TypeOf(a2), a3, reflect.TypeOf(a3))

	// 数据从高向低转换
	// 当一个整形的存储空间不够时， 它会由低想高轮回
	// int8类型最高位是127位   当存储128位的变量是int16类型 转换成 int8类型时 int8位数不够 会自动从最小的位轮回
	a4 := int8(a2)
	a2 += 1
	a5 := int8(a2)
	fmt.Println(a4, reflect.TypeOf(a4))
	fmt.Println(a5, reflect.TypeOf(a5))
}

// 整形与字符串之间的互换
func Proj2() {
	//	这种转换 智能转换int类型 不能转换 int8 int16等
	var a1 int
	a1 = 128
	// 整形转换字符串
	a2 := strconv.Itoa(a1)
	fmt.Println(a1, reflect.TypeOf(a1), a2, reflect.TypeOf(a2))

	// 字符串转换整形
	var a3 string
	a3 = "6xvv"
	// 默认返回两个值， 若能转换则 赋值给a3 err为空, 若不能 则无法赋值， err中存储错误
	a4, err := strconv.Atoi(a3)
	fmt.Println(a3, reflect.TypeOf(a3), a4, reflect.TypeOf(a4))
	fmt.Println(err)
}

func Proj3() {
	// math 方法 进行数学运算

	// 绝对值
	fmt.Println(math.Abs(-19))
	// 向下取整
	fmt.Println(math.Floor(3.14))
	// 向上取整
	fmt.Println(math.Ceil(3.14))
	// 就近取整
	fmt.Println(math.Round(3.3478))
	// 保留小数点后两位
	fmt.Println(math.Round(3.1456*100) / 100)
	// 取余
	fmt.Println(math.Mod(11, 3))
	// 计算次方
	fmt.Println(math.Pow(2, 5))
	// 两个值比较取较大值
	fmt.Println(math.Max(1, 2))
	// 两个值比较取较小值
	fmt.Println(math.Min(1, 2))

}
